
#include "User_App.h"
#include "bsp_port.h"

#include "bsp_Timer.h"
#include "bsp_PWM.h"
#include "bsp_DS1302.h"
#include "bsp_soft_PWM.h"
#include "u_Key.h"
#include "u_Oled.h"
#include "u_Beep.h"
#include "bsp_Task.h"
#include "u_Task.h"

#include "menu.h"

info_t info = {
    .Automatic_Model_t = {
        .Change_Water_t = {
            .State = 5,
        },
    },
    .Manual_Model_t = {
        .Circulate_Pump_t = {
            .State = 13,
        },
    },
};

bsp_TIM_t Ti_RUN_LED;
bsp_TIM_t Ti_Update_Data; // 更新数据
bsp_TIM_t Ti_Clock;       // 读取时间数据
bsp_TIM_t Ti_Add_Water;   // 定时补水

extern Menu_t MenuVI_Chief[];
extern Menu_t MenuVII_Heat[];
extern Menu_t MenuVII_Manual_Debug[];
extern Menu_t MenuVIII_Automatic_Brew_Water[];
extern Menu_t MenuVIII_Circulate_Pump[];
extern u_Task_t Add_Water;
extern u_Task_t Change_Water;

void Ti_RUN_LED_event(void);
void Ti_Update_Data_event(void);
void Ti_Clock_event(void);
void Ti_Add_Water_event(void);

void bsp_Ti_Debug(void);
void Output_All_Debug(void);

void User_App(void)
{
#if 0

  // LED_Run_Debug();
  // bsp_Ti_Debug();
  // KEY_Debug();
  // bsp_PWM_Debug();
  // OLED_Menu_Debug();
  // Output_All_Debug();
  // bsp_DS1302_Debug();
  // bsp_softPwm_Debug();
  u_Task_Debug();
#else
  u_OLED_Init();
  Beep_Init();
  DS1302_Init();

  bsp_Task_Obj_New(&Add_Water);
  bsp_Task_Obj_New(&Change_Water);

  Ti_obj_New(&Ti_RUN_LED, 500, Ti_RUN, Ti_RUN_LED_event);
  Ti_obj_New(&Ti_Update_Data, 200, Ti_RUN, Ti_Update_Data_event);
  Ti_obj_New(&Ti_Clock, 250, Ti_RUN, Ti_Clock_event);
  Ti_obj_New(&Ti_Add_Water, ONE_DAY_MS * 1, Ti_STOP, Ti_Add_Water_event);

  while (1)
  {
    OLED_Menu_Handle();
    KEY_All_event_Handle();
    bsp_soft_PWM_All_Handle();
    bsp_Task_Handle();
    bsp_Ti_All_Handle(); // 定时任务处理函数，放到程序主循环里
  }
#endif
}

void LED_Run_Debug(void)
{
  while (1)
  {
    LED_RUN_TOGG;
    LL_mDelay(500);
  }
}
/*  @brief  LED运行灯闪烁
    @return 无
    @property 无
*/
void Ti_RUN_LED_event(void)
{
  // 添加需要执行的程序
  // printf("hedddd\n");

  LED_RUN_TOGG; // 一个翻转GPIO的宏定义
}
/*  @brief  定时更新数据
    @return 无
    @property 无
*/
void Ti_Update_Data_event(void)
{
  // MenuVIII_Automatic_Brew_Water[2].Data = info.Automatic_Model_t.Brew_Water_t.Timer_Len; // 困水时间
  // MenuVIII_Circulate_Pump[1].Data = info.Manual_Model_t.Circulate_Pump_t.State;          // 主循环泵
  info.Manual_Model_t.Expel_Position = MenuVII_Manual_Debug[9].Data = bsp_Get_Waterline();
  if (MenuVII_Manual_Debug[9].Data == 1)
  {
    MenuVII_Manual_Debug[9].Name = "补水水位[1]";
  }
  else
  {
    MenuVII_Manual_Debug[9].Name = "补水水位[0]";
  }
}
/*  @brief  定时获取时钟数据
    @return 无
    @property 无
*/
void Ti_Clock_event(void)
{
  info.Manual_Model_t.Timer_t.Seconds = DS1302_Read_Reg(0x81); // 读秒
  info.Manual_Model_t.Timer_t.Minute = DS1302_Read_Reg(0x83);  // 读分
  info.Manual_Model_t.Timer_t.Hour = DS1302_Read_Reg(0x85);    // 读时
  info.Manual_Model_t.Timer_t.Day = DS1302_Read_Reg(0x87);     // 读日
  info.Manual_Model_t.Timer_t.Moon = DS1302_Read_Reg(0x89);    // 读月
  info.Manual_Model_t.Timer_t.Week = DS1302_Read_Reg(0x8B);    // 读星期
  info.Manual_Model_t.Timer_t.Year = DS1302_Read_Reg(0x8D);    // 读年
}
/*  @brief  定时补水
    @return 无
    @property 无
*/
void Ti_Add_Water_event(void)
{
  bsp_Task_Obj_Set_Run(&Add_Water);
}

/*  @brief  定时任务调试程序
    @return 无
    @property 调试时用
*/
void bsp_Ti_Debug(void)
{
  Ti_obj_New(&Ti_RUN_LED, 500, Ti_RUN, Ti_RUN_LED_event);

  while (1)
  {
    bsp_Ti_All_Handle();
  }
}
/*  @brief  所有输出测试
    @return 无
    @property 无
*/
void Output_All_Debug(void)
{
  uint8_t switch_debug = 0;
  while (1)
  {
    if (switch_debug == 1)
    {
      switch_debug = 0;

      bsp_Ctrl_Circulate_Pump(ON_s);
      bsp_Ctrl_Expel_Pump(ON_s);
      bsp_Ctrl_Supply_Pump(ON_s);
      bsp_Ctrl_Oxygen_Pump(ON_s);
      bsp_Ctrl_Lamp(ON_s);
      bsp_Ctrl_Feed_Device(ON_s);
      bsp_Ctrl_Fishbowl_Heat(ON_s);
      bsp_Ctrl_SupplyTub_Heat(ON_s);
    }
    else
    {
      switch_debug = 1;

      bsp_Ctrl_Circulate_Pump(OFF_s);
      bsp_Ctrl_Expel_Pump(OFF_s);
      bsp_Ctrl_Supply_Pump(OFF_s);
      bsp_Ctrl_Oxygen_Pump(OFF_s);
      bsp_Ctrl_Lamp(OFF_s);
      bsp_Ctrl_Feed_Device(OFF_s);
      bsp_Ctrl_Fishbowl_Heat(OFF_s);
      bsp_Ctrl_SupplyTub_Heat(OFF_s);
    }
    LL_mDelay(1000);
  }
}
